import { Injectable } from '@nestjs/common';
import * as QRCode from 'qrcode';

/**
 * 二维码服务
 * 基于 NestJS 官方示例实现
 * 参考: https://docs.nestjs.cn/fundamentals/dependency-injection
 * 对应 Java: QRCodeUtils
 */
@Injectable()
export class QrcodeService {
  /**
   * 生成二维码字符串
   */
  async toString(
    text: string,
    options?: QRCode.QRCodeToStringOptions,
  ): Promise<string> {
    return QRCode.toString(text, options);
  }

  /**
   * 生成二维码数据URL
   */
  async toDataURL(
    text: string,
    options?: QRCode.QRCodeToDataURLOptions,
  ): Promise<string> {
    return QRCode.toDataURL(text, options);
  }

  /**
   * 生成二维码Buffer
   */
  async toBuffer(
    text: string,
    options?: QRCode.QRCodeToBufferOptions,
  ): Promise<Buffer> {
    return QRCode.toBuffer(text, options);
  }

  /**
   * 生成二维码文件
   */
  async toFile(
    path: string,
    text: string,
    options?: QRCode.QRCodeToFileOptions,
  ): Promise<void> {
    return QRCode.toFile(path, text, options);
  }

  /**
   * 生成简单二维码
   */
  async generateSimple(text: string): Promise<string> {
    return this.toDataURL(text, {
      type: 'image/png',
      // quality: 0.92, // 新版本 qrcode 不支持 quality 参数
      margin: 1,
      color: {
        dark: '#000000',
        light: '#FFFFFF',
      },
    });
  }

  /**
   * 生成彩色二维码
   */
  async generateColor(
    text: string,
    darkColor: string = '#000000',
    lightColor: string = '#FFFFFF',
  ): Promise<string> {
    return this.toDataURL(text, {
      type: 'image/png',
      // quality: 0.92, // 新版本 qrcode 不支持 quality 参数
      margin: 1,
      color: {
        dark: darkColor,
        light: lightColor,
      },
    });
  }

  /**
   * 生成大尺寸二维码
   */
  async generateLarge(text: string, size: number = 300): Promise<string> {
    return this.toDataURL(text, {
      type: 'image/png',
      // quality: 0.92, // 新版本 qrcode 不支持 quality 参数
      margin: 1,
      width: size,
      color: {
        dark: '#000000',
        light: '#FFFFFF',
      },
    });
  }

  /**
   * 生成小尺寸二维码
   */
  async generateSmall(text: string, size: number = 100): Promise<string> {
    return this.toDataURL(text, {
      type: 'image/png',
      // quality: 0.92, // 新版本 qrcode 不支持 quality 参数
      margin: 1,
      width: size,
      color: {
        dark: '#000000',
        light: '#FFFFFF',
      },
    });
  }

  /**
   * 生成SVG二维码
   */
  async generateSVG(
    text: string,
    options?: QRCode.QRCodeToStringOptions,
  ): Promise<string> {
    return this.toString(text, {
      type: 'svg',
      ...options,
    });
  }

  /**
   * 生成ASCII二维码
   */
  async generateASCII(
    text: string,
    options?: QRCode.QRCodeToStringOptions,
  ): Promise<string> {
    return this.toString(text, {
      type: 'terminal',
      ...options,
    });
  }
}
